iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
佛心分享-刷題不只是刷題

圖解LeetCode(入門篇)系列 第 13

圖解LeetCode(入門篇): 67. Add Binary

  • 分享至 

  • xImage
  •  

67. Add Binary

题目描述:

給定兩個二進制字符串 ab,返回它們的和(用二進制表示)。輸入為非空字符串,且只包含數字 10

Example:

  • Input: a = "1010", b = "1011"
  • Output: "10101"

解題思路:
這道題與上一題 66. Plus One 非常相似,但不同之處在於這次的輸入是字符串,因此需要對字符串進行逐位拆解和重組。我們可以從兩個字符串的末尾開始,逐位相加並處理進位問題。這個過程類似於手動相加十進制數字,從最低位開始逐位相加,記錄結果和進位,最終得到的就是這兩個二進制數相加後的二進制表示。

還記得 9. Palindrome Number 那道題中,我們如何處理逐位拆解數字和進位操作嗎?這道題的不同之處在於這裡處理的是二進制數字,但方法幾乎相同。在二進制中,逐位拆解數字需要使用取餘數操作,即 x % 2,而進位操作則是將數字除以 2 後取整數部分,即 Math.floor(x / 2)

在 JavaScript 中,我們可以使用 parseInt 函式將輸入的字符串轉換為整數。不過需要注意的是,parseInt 函式的第二個參數應該明確指定進位方式,以避免出現不預期的結果。由於這題處理的是二進制數字,因此第二個參數應設為 2。這樣能確保字符串正確地轉換為二進制整數。
https://ithelp.ithome.com.tw/upload/images/20240822/20168306qwGRjrvWBl.jpg

var addBinary = function(a, b) {
    let result = "";
    let carry = 0;
    let i = a.length - 1;
    let j = b.length - 1;

    while (i >= 0 || j >= 0 || carry > 0) {
        const digitA = i >= 0 ? parseInt(a[i], 2) : 0;
        const digitB = j >= 0 ? parseInt(b[j], 2) : 0;

        const sum = digitA + digitB + carry;
        carry = Math.floor(sum / 2);
        result = (sum % 2) + result;

        i--;
        j--;
    }

    return result;
};

時間複雜度:O(max(n, m)),其中 nm 分別是字符串 ab 的長度。我們需要遍歷較長的字符串長度。
空間複雜度:O(max(n, m)),用於存儲結果字符串所需的空間。

總結:
總體來說,這道題目與之前的題目有許多相似之處,無論是進位處理還是逐位拆解數字,都是在不同進制下的應用。通過這題,我們鞏固了二進制運算的基礎,並複習了如何靈活應用相似方法。無論是十進制還是二進制,理解並掌握這些基本操作對學習更複雜的算法至關重要。這道題目可以歸類為「while 迴圈」。同時,LeetCode 的題目設計往往有前後關聯,建議讀者依序解題,以便藉由累積經驗應對更困難的挑戰。


上一篇
圖解LeetCode(入門篇): 66. Plus One
下一篇
圖解LeetCode(入門篇): 69. Sqrt(x)
系列文
圖解LeetCode(入門篇)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言